package com.xlx.openLink.uitls;

import com.xlx.openLink.conf.MailBean;
import com.xlx.openLink.conf.SystemInit;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

public class SendEmailUtils {

    public static void sendMaill(MailBean mailBean, String receiveMailAccount, String msg) throws Exception {
        //1. 创建参数配置 用于连接邮件服务器的参数配置
        Properties props = new Properties();//参数配置
        props.setProperty("mail.transport.protocol", mailBean.protocol);//使用的协议(JavaMail规范要求)
        props.setProperty("mail.smtp.host", mailBean.emailSMTPHost);//发件人的邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.auth", "true");//需要请求认证
        //2. 根据配置创建会话对象 用于和邮件服务器交互
        Session session = Session.getInstance(props);
        session.setDebug(true);//设置为debug模式 可以查看详细的发送 log

        //3. 创建一封邮件 用发件人邮箱给收件人邮箱发一封邮件
        MimeMessage message = createMimeMessage(session, mailBean.emailAccount, receiveMailAccount, msg);

        //4. 根据Session获取邮件传输对象
        Transport transport = session.getTransport();

        /*
         * 5. 使用邮箱账号和密码连接邮件服务器 此处认证的邮箱必须与 message中的发件人邮箱一致 否则报错
         * PS:成败的判断关键在此 如连接服务器失败 程序会在控制台输出相应失败原因的log日志 仔细查看错误
         * 有些邮箱服务器会返回错误码或查看错误类型的链接 根据给出的错误类型 到对应邮件服务器的帮助网站上查看具体失败原因
         *
         * PS:通常连接失败的原因:
         * 邮箱没有开启 SMTP服务
         * 邮箱密码错误 例如某些邮箱开启了独立密码(设置授权码就必须用授权码作为密码使用)
         * 邮箱服务器要求必须要使用 SSL安全连接
         * 请求过于频繁或其他原因 被邮件服务器拒绝服务网易邮箱严格 换个邮箱开始SMTP使用 或者去邮箱官网查看帮助
         */
        transport.connect(mailBean.emailAccount, mailBean.emailPassword);

        //6. 发送邮件 发到所有的收件地址  message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人  抄送人
        //密送人
        transport.sendMessage(message, message.getAllRecipients());

        //7. 关闭连接
        transport.close();
    }


    /*
     * 创建一封只包含文本的简单邮件
     * @param session		和服务器交互的会话
     * @param sendMail		发件人邮箱
     * @param receiveMail	收件人邮箱
     * @return
     * @throws Exception
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String msg) throws Exception {
        //1. 创建一封邮件
        MimeMessage message = new MimeMessage(session);

        /*
         * from字段 　　--用于指明发件人
         * to字段 　　    --用于指明收件人
         * subject字段  --用于说明邮件主题
         * cc字段 　　   -- 抄送 将邮件发送给收件人的同时抄送给另一个收件人 收件人可以看到邮件抄送给了谁
         * bcc字段 　　 -- 密送 将邮件发送给收件人的同时将邮件秘密发送给另一个收件人 收件人无法看到邮件密送给了谁
         */

        //2. From:发件人的昵称
        message.setFrom(new InternetAddress(sendMail, "连发通信智慧管控平台", "UTF-8"));

        //3. To:收件人的昵称(可以增加多个收件人 抄送 密送)
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "VIP-User", "UTF-8"));

        //4. Subject:邮件主题
        message.setSubject("云溪网管系统告警", "UTF-8");

        //5. Content:邮件正文(可以使用html标签 浏览器会解析)
        message.setText(msg);
        //6. 设置发件时间
        message.setSentDate(new Date());

        //7. 保存设置
        message.saveChanges();

        return message;
    }

}
